EC2をHVMに移行するモチベーション – AWS Advent Calendar 2014:9日目
ウィスキー、シガー、パイプをこよなく愛する大栗です。 本エントリはAWSに関するアドベントカレンダー『AWS Advent Calendar 2014』の9日目の内容となります。
AWSを以前から使用されている方は、EC2の仮想化タイプをPVで起動している場合が多いと思います。そのため、最近のEC2のインスタンスタイプではHVMが必須の物もあるにも関わらずPVに対応しているインスタンスタイプのみを使用されているパターンが多く見られます。 しかし、PVからHVMへ移行する事に利点があるのでまとめてみました。
仮想化タイプ
EC2のハイパーバイザには2種類の方式があり、AMIにより決まっています。
準仮想化(PV)
準仮想化は、EC2のユーザーガイドに以下の様な説明はあります。
準仮想化 AMI は、PV-GRUB と呼ばれる特別なブートローダーを使用して起動します。(中略)準仮想化のゲストは仮想化を明示的にサポートしていないホストのハードウェア上で実行されますが、これらのゲストは特別なハードウェア拡張(拡張ネットワーキングや GPU 処理など)を利用できません。従来、PV のゲストは HVM のゲストよりも多くの場合にパフォーマンスが向上しました。ただし、HVM 仮想化の機能強化や HVM AMI で PV ドライバが利用可能になったことにより、このようなパフォーマンスの向上はなくなりました。
従来はHVMに比べてパフォーマンスが優位でしたが、現在はパフォーマンスに優位性は無いと読めます。
完全仮想化(HVM)
完全仮想化は、EC2のユーザーガイドに以下の様な説明はあります。
HVM AMI は、完全に仮想化された一連のハードウェアを備えており、イメージのルートブロックデバイスのマスターブートレコードを実行することによって起動します。この仮想化タイプでは、ベアメタルハードウェア上でオペレーティングシステムが動作するのと同様に、修正を行わなくても仮想マシン上でオペレーティングシステムを直接実行することができます。Amazon EC2 ホストシステムでは、ゲストに提供されている基盤となるハードウェアの一部またはすべてがエミュレートされます。
HVMではゲストOSの修正が不要なので、ハイパーバイザを意識せずにOSを実行できます。 WindowsのAMIは以前からHVMのみ対応でした。
拡張ネットワーキング(SR-IOV)
HVMでは特定のインスタンスタイプ(C3、R3、I2)を使用すると拡張ネットワーク機能を使用できます。拡張ネットワーキングではSR-IOVを使用する事ができるため、ハイパーバイザを通さずに直接物理層にアクセスできるため、パフォーマンス向上が見込めます。
ベンチマーク1
パフォーマンスを実際に計測しました。
計測環境
計測環境
計測は定番のUnixBenchを使用しました。 計測環境は以下の通りです。
- UnixBench 5.1.3
- EC2インスタンス:c3.xlarge
- EBS:gp2 500GB
- 使用リージョン:東京(ap-northeast-1)
計測対象
計測対象は、CentOS 6.5を使用しました。PVとHVMはMarketPlaceのAMIを使用しています。SR-IOVが有効なAMIはid:understeer氏が作成した物を使用しています。
- CentOS 6.5(PV):ami-25436924
- CentOS 6.5(HVM):ami-13614b12
- CentOS 6.5(HVM SR-IOV):ami-7fa6fe7e
計測結果
以下が計測結果になります。なお、UnixBenchは複数回計測した結果の平均を出力するため、UnixBench自体の計測回数は1回です。
準仮想化 | 完全仮想化 | 完全仮想化 (SR-IOV有効) | |||
---|---|---|---|---|---|
スコア | PV比 | スコア | PV比 | ||
Dhrystone 2 using register variables (整数演算) | 6730.6 | 6697 | 100% | 6581 | 98% |
Double-Precision Whetstone (浮動小数点) | 2322.1 | 2313.7 | 100% | 2319.4 | 100% |
Execl Throughput (システムコール) | 858.6 | 2477.2 | 289% | 2505.8 | 292% |
File Copy 1024 bufsize 2000 maxblocks (ディスクI/O) | 790.4 | 1957.6 | 248% | 1903.4 | 241% |
File Copy 256 bufsize 500 maxblocks (ディスクI/O) | 486.5 | 1160.2 | 238% | 1202.1 | 247% |
File Copy 4096 bufsize 8000 maxblocks (ディスクI/O) | 1595.9 | 4054.8 | 254% | 3956.9 | 248% |
Pipe Throughput (パイプ) | 726 | 2687.3 | 370% | 2804.1 | 386% |
Pipe-based Context Switching (パイプ) | 411.4 | 1727.6 | 420% | 1815.2 | 441% |
Process Creation (プロセスフォーク) | 586.4 | 2841 | 484% | 2921 | 498% |
Shell Scripts (1 concurrent) (シェルのテキスト処理:1並列) | 1480.1 | 3221.9 | 218% | 3246.9 | 219% |
Shell Scripts (8 concurrent) (シェルのテキスト処理:8並列) | 1388.4 | 3149 | 227% | 3164.6 | 228% |
System Call Overhead (システムコール) | 640.5 | 3416.9 | 533% | 3650.8 | 570% |
System Benchmarks Index Score (総合スコア) | 1054.8 | 2716.7 | 258% | 2757.3 | 261% |
単純なCPU性能に影響する整数演算や浮動小数点演算はPVとHVMで差はありませんが、それ以外ではHVMがPVの2〜5倍高速になっています。ディスクI/Oやシステムコールが高速になっていますので、CPU処理のみを行う特殊な用途以外ではHVMのパフォーマンスが大幅に良くなります。 ネットワークI/Oは計測していないため、SR-IOVの有無でパフォーマンスに大きな差はありませんでした。
ベンチマーク2
PVとHVMで、総合スコアで2.5倍の向上が見られましたので、PVからHVMへ移行する場合にダウンサイジングが可能ではないかと思います。そのため以下の条件で追加のベンチマークを実施しました。
計測対象
HVMのインスタンスサイズを1つ小さくしてc3.largeで計測しました。PVはベンチマーク1の結果を採用します。
- CentOS 6.5(PV):c3.xlarge
- CentOS 6.5(HVM):c3.large
- CentOS 6.5(HVM SR-IOV):c3.large
使用するインスタンスのスペックを比較すると以下になります。
c3.xlarge | c3.large | |
CPUコア数 | Xeon E5-2680 v2 | Xeon E5-2680 v2 |
CPUコア数 | 2 cores | 4 cores |
メモリサイズ | 3.75 GB | 7.5 GB |
ネットワーキング パフォーマンス | 中 | 中 |
計測結果
ベンチマーク1と同様に計測しました。
準仮想化 c3.xlarge | 完全仮想化 c3.large | 完全仮想化 (SR-IOV有効) c3.large | |||
---|---|---|---|---|---|
スコア | PV比 | スコア | PV比 | ||
Dhrystone 2 using register variables (整数演算) | 6730.6 | 3355.5 | 50% | 3287.5 | 49% |
Double-Precision Whetstone (浮動小数点) | 2322.1 | 1161.6 | 50% | 1158.6 | 50% |
Execl Throughput (システムコール) | 858.6 | 1223.9 | 143% | 1206.4 | 141% |
File Copy 1024 bufsize 2000 maxblocks (ディスクI/O) | 790.4 | 2411.2 | 305% | 2288.9 | 290% |
File Copy 256 bufsize 500 maxblocks (ディスクI/O) | 486.5 | 1483.2 | 305% | 1493.3 | 307% |
File Copy 4096 bufsize 8000 maxblocks (ディスクI/O) | 1595.9 | 5014.4 | 314% | 5059.2 | 317% |
Pipe Throughput (パイプ) | 726 | 1443.5 | 199% | 1416.4 | 195% |
Pipe-based Context Switching (パイプ) | 411.4 | 941.8 | 229% | 903.3 | 220% |
Process Creation (プロセスフォーク) | 586.4 | 1626.7 | 277% | 1600.7 | 273% |
Shell Scripts (1 concurrent) (シェルのテキスト処理:1並列) | 1480.1 | 1651.5 | 112% | 1650.8 | 112% |
Shell Scripts (8 concurrent) (シェルのテキスト処理:8並列) | 1388.4 | 1583.1 | 114% | 1596.5 | 115% |
System Call Overhead (システムコール) | 640.5 | 1992.4 | 311% | 1937.7 | 303% |
System Benchmarks Index Score (総合スコア) | 1054.8 | 1776.1 | 168% | 1751.1 | 166% |
直接CPUパワーがスコアになる整数演算や浮動小数点演算以外は、スペックが半分のHVMがPVを上回っています。 そのためUnixBenchの総合スコアは、インスタンスサイズが小さいHVMの方が良くなっています。
まとめ
HVMにする事で、ディスクI/Oやシステムコール等の割込みのパフォーマンスが大幅に向上する事が分かりました。PVからHVMへ移行する事により、EC2インスタンスのスペック縮小や台数削減が可能になるのではないでしょうか。
さいごに
今までと同じ様にPVでEC2を使用しなければならない事もあると思いますが、定期的に見直しをすると良いと思います。